SQL 进阶

-------------------------SQL 进阶-------------------------

1.case 语句的用法:

a) 用法一 :-->直接对列进行值判断(类似于C#中的Switch case)

注意: then后返回的值的类型必须一致(因为列的类型只有一种)

Case 列名

When 条件1 then '自定义1';

When 条件2 then '自定义2';

When 条件3 then '自定义3';

Else ' 默认'

End

b) 用法二:是用来对表达式 case 输出结果,一般是用来为 列的取值范围(但不一定非得用 列)

Case

When 表达式1 then ' 类型名1'

When 表达式2 then ' 类型名2'

When 表达式3 then ' 类型名3'

Else ''类型名4'

End

2.子查询 : 在已经搜索的结果集上 再 进行查询操作.(将一个查询语句 作为一个结果集)

a) 注意: 一定要给结果集 取别名.

b) 查询关键字  in, not in ,exists,not exists

c) Exists用法: --->类似 in 关键字

i. In关键字 先查询子查询  再进行 主查询

ii. Exists关键字  先查询 主查询,再进行 子查询 ,将匹配的数据显示出来  举例:

select * from PhoneNum where exists(select * from PhoneType where PhoneNum.pTypeId=PhoneType.ptId)

iii. 判断结果集是否为null

3.----any  all---- 用法: 匹配结果集使用 

4.注意 : in/ all/ any/ 匹配结果集使用时 , 结果集只能有一个列 

a) Any : where typeId = any ( 1,2,3 )

b) All : where typeId = all ( 1,2,3 )

5.只有返回 且 仅返回一行,一列数据的子查询 才能当成单值子查询

6.子查询在以下条件时只能是一个列: 子查询跟随在 =,!=,<,>,之后,或者子查询作为表达式.

 

7.------------------------分页查询语句----------------------------

Row_number() over(order by id) 根据id的升序生成了一列新的连续的 序号 

--1.使用排序分页缺点:查询次数多,查询数据量大

select * from (

select top 5 * from (select top 10 * from area order by ar_id ASC) as t order by ar_id desc

) as c order by ar_id asc

 

--2.not in 缺点:查询数据量大

--n

select top 5 * from Area where ar_id not in(select top 5 ar_id from Area)

 

--3.between and 缺点:如果id不连续(1,3,4,5),则会出现查出来的页里不满行的情况

select top 5 * from Area--第一页

select  * from Area where ar_id between 0 and 4

 

select  * from Area where ar_id between 5 and 9

 

select  * from Area where ar_id between 10 and 14

 

--4.ROW_NUMBER 结合between and

--ROW_NUMBER() over (order by ar_id) 根据ar_id的升序生成了一列新的连续的序号

select * from(

       select ROW_NUMBER() over (order by ar_id) as rnum,* from Area

   ) as t 

where rnum between 10 and 14--按照ROW_NUMBER()生成的序号来分页

-----------------------------表连接--------------------------------

8.内连接: inner join  on

a)  Inner Join  on --- >From T1 join T2 on T1.id=T2.cid  where 条件

b)  Join必须跟在 from 表名之后,内连接,只会将两张表中,符合 on 条件的行 拼接显示出来

c) 需要多表连接时,只需 进行 多个inner join on 连接即可

9.左外连接 left outer join  on(以左表为主) :

a) 显示join左边表的所有记录,右侧表中 符合条件的显示,不符合条件的显示NULL.

10.右连接 right outer join on (以右表为主)

b) 显示join右边表的所有记录,左侧表中 符合条件的显示,不符合条件的显示NULL.

11. 交叉连接 cross join (两张表的乘积)

12. 全连接 Full  join  on (不管两边是否满足条件,全都显示,对方如果没有对应的数据,则显示NULL)

 

 

--------------------------------视 图---------------------------

1.视图是一张虚拟表, 表示一张表的部分数据 或 多张表的综合数据,其结构和数据时建立在对表的查询基础上

2.对视图做 新增 修改 删除 操作的时候,只能针对一个 基表的列,不能同时更新或新增多个基表的列, 不提倡对视图进行新增修改操作,因为视图存在的目的就是 方便查询.

3.视图在操作上和数据表没有什么区别,但两者的差异是其本质不同 : 数据表是实际存储记录的地方,然而视图并不保存热河记录

4.视图的目的:方便查询,所以一般情况下 不能删除

5.创建视图 : create view 视图名 as (连接查询)

5.视图优点:

a) 筛选表中的行

b) 防止未经许可的用户访问敏感数据

c) 降低数据库的复杂程度

6.使用视图 注意事项:

a) 视图中的查询不能使用order by, 除非指定了top语句

i. 视图被认为是一个虚拟表,表示一个集合,是不能有顺序的,而by则返回的是一个有顺序的,是一个游标.

ii. 在视图中使用select top 10 percent +order by 问题

7.创建视图的sql语句:

create view vw_StusInfo

as

select  top  50  percent  s.id, s.name as stuName ,c.Name as className,s.age 

from  Student  as  s 

inner join Class  as  c 

on  s.cid = c .Id

order by stuName asc

 

8.-查询视图

select * from  vw_StusInfo  where  id>10

 

--于视图等价的子查询

select * from 

(

select s.id,s.name as stuName ,c.Name as className,s.age 

from Student as s 

inner join Class as c 

on s.cid = c .Id

)  as  t

 where id>10

 

posted @ 2012-07-12 00:09  zxp19880910  阅读(195)  评论(0编辑  收藏  举报